package main

import "fmt"

//使用值接收者和指针接收者的区别

type animal interface {
	move()
	eat(food string)
}

type cat struct {
	name string
	feet int8
}

//使用值接收者实现了接口的所有方法
/* func (c cat) move() {
	fmt.Println("猫上房")
}

func (c cat) eat(food string) {
	fmt.Printf("小猫%s爱吃%s \n", c.name, food)
} */

//使用指针接收者实现了接口的所有方法
func (c *cat) move() {
	fmt.Println("猫上房")
}

func (c *cat) eat(food string) {
	fmt.Printf("小猫%s爱吃%s \n", c.name, food)
}

func main() {

	var a1 animal
	c1 := cat{
		name: "Tom",
		feet: 2,
	} //cat
	fmt.Printf("c1===%T===%v\n", c1, c1)
	c2 := &cat{
		name: "Tom1",
		feet: 4,
	} //*cat
	fmt.Printf("c2===%T===%v\n", c2, c2)
	a1 = &c1 //实现animal这个接口的是cat的指针类型

	fmt.Printf("a1=c1---%T---%v \n", a1, a1)
	a1 = c2
	fmt.Printf("a1=c2---%T---%v \n", a1, a1)

	/* 	值接收者    指针接收者的区别
	   	使用值接收者实现接口，结构体类型和结构体指针类型的变量都能存
	   	使用指针接收者只能结构体指针类型的变量都能存 */

}
